home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy004 / files / articulo.009 < prev    next >
Encoding:
Text File  |  1997-06-14  |  6.5 KB  |  162 lines

  1. *cX  Curso de Programación orientada a objetos
  2.  
  3. *cB     Los primeros ejercicios
  4. *cR
  5.   En este número no veremos cosas nuevas, nos 
  6. limitaremos a asentar lo  aprendido  en ante-
  7. riores entregas. Por ello  teneis  en  el di-
  8. recctorio "OOP" todos los fuentes  que comen-
  9. taré más adelante.
  10.  Trataremos de hacer un pequeño  programa  en
  11. C++ que sirva para hacer juegos  de  *cLROL*cR  con
  12. versacionales (al estilo *cLMUD*cR, sin gráficos ni 
  13. complicaciones).  Lo  que  haremos,  será  un
  14. juego en principio que, número  tras  número,
  15. le hiremos añadiendo  cosas  para  acabar  te
  16. niendo un kernel para diseñar  juegos conver-
  17. sacionales.
  18.   Comenzaremos este proyecto  como  cualquier
  19. otro, es decir, escribiendo en lápiz y  papel
  20. lo que  queremos  hacer,  como  lo  vamos  ha
  21. hacer, etc. Esto no lo haré yo aquí, pero  es
  22. recomendable que lo hagais vosotros para ver-
  23. lo que hace falta (ya os lo  mostraré  cuando
  24. llegué el número de las notaciones orientadas 
  25. a objetos, técnica Bosch, etc).
  26.                      *i'
  27. *cB     El juego
  28. *cR
  29.   El objetivo serà crear un programa  (juego)
  30. interactivo con el usuario  que  acepte  unos
  31. cuantos comandos (por ahora no muchos) y cuya 
  32. base parezca lo que acostrumbramos  a  llamar
  33. juego conversacional. Estan claros algunos de 
  34. los elementos que contendrá:  mostruos, obje-
  35. tos, armas, habitaciones, etc.
  36.   En  esta  primera  toma  de  contacto,  nos
  37. conformaremos con poder definir unos  cuantos
  38. objetos y habitaciones, más  adelante  iremos
  39. ampliando el juego y con  ello  descubriremos
  40. la potencia de C++ a la hora de reutilizar el 
  41. código. Por ejemplo, definiremos  un  objeto,
  42. pero un arma no es más que otro  objeto,  así
  43. que la heredaremos y nos ahorraremos escribir 
  44. mucho código.
  45.   En  el  directorio  *cTOOP*cR  encontrareis  tres
  46. ficheros *cC.CPP*cR y otros 2 *cC.HPP*cR, que  son  todos
  47. los que tiene el juego por ahora.  Los fiche-
  48. ros *cC.HPP*cR son definiciones de  clase,  en  con
  49. creto,  de  las  clases *c1 "objeto" *cR y  *c1"room"*cR.
  50. Los *cC.CPP*cR son las implementaciones  de  dichas
  51. clases.                            *i(
  52.  
  53. *cB     La clase 'objeto'
  54. *cR
  55.   En la própia definición de la clase podemos 
  56. ver algunos rasgos  característicos  de  C++.
  57. Por ejemplo,  cuando  incluimos  en  nuestros
  58. programas C++ ficheros  que  provenian  de  C
  59. (como en este  caso  *c2"stdio.h"*cR)  tenemos  que
  60. hacerlo   preponiendo   la   palabra    clave
  61. *c3"extern"*cR. Otra característica, común a  todos
  62. los lenguajes POO, es que  las  variables  de
  63. cada clase estan en la  parte  privada, mien-
  64. tras las funciones lo estan en la  pública  o
  65. privada indiferentemente. No  es  que  no  se
  66. pueda, sino que no se debe por  varias  cosas
  67. que ya hemos comentado en anteriores números.
  68.   Tenemos una cosita interesante en  la defi-
  69. nición   de   las   funciones:   la   función
  70. *c4"es_nombre()"*cR, aunque no lo parezca,  es  una
  71. función 'inline'. Digo que no lo parece,  más
  72. que nada, porque no lleva la palabra  reserva
  73. da *c5'inline'*cR delante, pero la  verdad  es  que
  74. todas las funciones que se implementan en  la
  75. própia definición de la clase, son por defec-
  76. to funciones "en línea".
  77.   Ya en la implementación de la  clase *c1'obje-
  78. to'*cR, podemos ver la inclusión del fichero  de
  79. definición, cosa que debemos hacer siempre ya 
  80. que si no el compilador no sabe  donde  estan
  81. definidas las funciones que estamos implemen-
  82. tando. Todas las funciones son muy  sencillas
  83. en  sí,  pero  cabe   destacar   la   función
  84. *c4"es_un()"*cR que indica si la cadena de caràcte-
  85. res que se le pasa es  igual  al  nombre  del
  86. objeto.                      *i)
  87.  
  88. *cB     La clase 'room'
  89. *cR
  90.   Esta clase define las habitaciones; contie-
  91. ne una descripción, punteros a las habitacio-
  92. nes a las que puede acceder (norte, este, sur 
  93. y oeste) y un array con los objetos  que  hay
  94. en la própia habitación. Tambien  se  definen
  95. unas costantes que se usaran en las  llamadas
  96. a funciones para  indicar  movimientos  entre
  97. habitaciones.
  98.   En la implementación podemos  ver  las  fun
  99. ciones     implementadas.     La      función
  100. *c4"describe()"*cR, a parte de escribir la  descrip
  101. ción de  la  habitación,  escribe  todos  los
  102. objetos   que   se   ven.    Las    funciones
  103. *c4"coge_obj()"*cR y*c4 "deja_obj()"*cR lo que  hacen  es
  104. eso, coger y dejar objetos en la  habitación,
  105. devolviendo en el primer caso un puntero a un 
  106. *c5'objeto' *cRsi existe ese objeto en la  sala,  y
  107. en el segundo caso introduciendo el objeto en 
  108. el array de la habitación.       *i*
  109.  
  110. *cB     El módulo principal
  111. *cR
  112.   Como todavia no hemos hecho más  que comen-
  113. zar, las habitaciones y objetos estan defini-
  114. dos en el  própio  programa  principal.  Como
  115. podeis observar, en  C++  se  pueden  definir
  116. variables en cualquier lugar del  código  (en
  117. este  caso  ha  sido  muy  utilizado  en   el
  118. *c5'main'*cR).
  119.   Luego  hay  un  bucle*c5  'for' *cR infinito  que
  120. terminará cuando  se  introduzca  el  comando
  121. *c6"quit"*cR mediante un*c5 'exit'*cR. Se usa  ahora  (en
  122. el  próximo  número  ya  cambiará)  variables
  123. globales para llevar todos los datos como  en
  124. que sala se está, que se lleva encima, etc.
  125.   Viendo  el  código   podriais   preguntaros
  126. ¿porqué unas veces se accede a las  funciones
  127. de las clases con un punto y  otras  con  una
  128. flechita? No se si me explico, por ejemplo:
  129. *c7
  130.        habitacion1.describe();
  131.        habitacion2->describe();
  132. *cR
  133. La primera llamada se realiza cuando *c4'habita-
  134. cion1' *cRes un objeto, es decir, una  instancia
  135. de una clase própiamente dicho;  mientras  la
  136. segunda llamada se hace cuando  *c4'habitacion2'*cR
  137. es un puntero a un objeto.  Más  claro,  esas
  138. llamadas se harian  cuando  las  habitaciones
  139. hubieran  sido  definidas  de  la   siguiente
  140. forma:                            *i,
  141. *c7
  142.       Room habitacion1;
  143.       Room *habitacion2;
  144. *cR
  145.   Pues ya está todo este número,  sólo  queda
  146. compilar el ejemplo.  Yo  lo  hize  en  Turbo
  147. C/C++ v2.0 y para ello creé un  proyecto  que
  148. tambien se  incluye.  En  el  próximo  número
  149. veremos más características del C++  que  nos
  150. ayudaran en la programación de este  tipo  de
  151. juegos.  Algunas  de  estas   características
  152. seran la reutilización  de  código  (mediante
  153. herencia), mejora en  el  manejo  de  cadenas
  154. (con sobrecarga de operadores), etc. A parte, 
  155. tambien se limaran algunas asperezas como  la
  156. pérdida de memória (que a veces se  convierte
  157. en falta de  ella)  al  tener  guardados  los
  158. objetos en arrays limitados en tamaño (usare-
  159. mos listas).
  160.  
  161. *cM         *i+                        Navi Dj.
  162.